home *** CD-ROM | disk | FTP | other *** search
/ Aminet 8 / Aminet 8 (1995)(GTI - Schatztruhe)[!][Oct 1995].iso / Aminet / text / edit / GED313.lha / Install / data / tools / Source / prj.c < prev    next >
C/C++ Source or Header  |  1995-04-14  |  4KB  |  170 lines

  1. /* -----------------------------------------------------------------------------
  2.  
  3.   Example: How to read GoldED's project list. DICE:
  4.  
  5.   dcc prj.c -// -o ram:ReadList
  6.  
  7.   This is C source code to demonstrate reading of GoldED's project list using
  8.   ARexx. Might be useful if you intend to develop external project management
  9.   tools.
  10.  
  11.   ------------------------------------------------------------------------------
  12. */
  13.  
  14. /// "includes & prototypes"
  15.  
  16. #include <amiga20/exec/exec.h>
  17. #include <amiga20/rexx/errors.h>
  18. #include <amiga20/rexx/rxslib.h>
  19. #include <amiga20/clib/exec_protos.h>
  20. #include <amiga20/clib/rexxsyslib_protos.h>
  21.  
  22. #define Prototype extern
  23.  
  24. Prototype void   main(ULONG, char **);
  25. Prototype struct RexxMsg *SendRexxCommand(char *, char *, struct MsgPort *);
  26. Prototype void   FreeRexxCommand (struct RexxMsg *);
  27. Prototype ULONG  WaitForAnswer(struct MsgPort *, char *);
  28.  
  29. ///
  30. /// "main"
  31.  
  32. void
  33. main(argc, argv)
  34.  
  35. ULONG argc;
  36. char *argv[];
  37. {
  38.     static UBYTE version[] = "$VER: PRJ 1.1 (" __COMMODORE_DATE__ ")";
  39.  
  40.     struct MsgPort *replyPort;
  41.  
  42.     char *host = "GOLDED.1";
  43.  
  44.     if (replyPort = CreateMsgPort()) {
  45.  
  46.         if (SendRexxCommand(host, "LOCK CURRENT", replyPort)) {
  47.  
  48.             char result[80];
  49.  
  50.             if (WaitForAnswer(replyPort, result) == RC_OK) {
  51.  
  52.                 if (SendRexxCommand(host, "QUERY PRJLIST", replyPort)) {
  53.  
  54.                     if (WaitForAnswer(replyPort, result) == RC_OK) {
  55.  
  56.                         struct List *list;
  57.                         struct Node *node;
  58.  
  59.                         list = (struct List *)atol(result);
  60.  
  61.                         if (list->lh_Head->ln_Succ) {
  62.  
  63.                             for (node = list->lh_Head; node->ln_Succ; node = node->ln_Succ)
  64.                                 printf("%s (selected: %s)\n", node->ln_Name, node->ln_Pri ? "YES" : "NO");
  65.                         }
  66.                         else
  67.                             puts("project list is empty");
  68.                     }
  69.                 }
  70.                 if (SendRexxCommand(host, "UNLOCK", replyPort))
  71.                     WaitForAnswer(replyPort, result);
  72.             }
  73.         }
  74.         DeleteMsgPort(replyPort);
  75.     }
  76.     exit(0);
  77. }
  78.  
  79. ///
  80. /// "ARexx"
  81.  
  82. /* -------------------------------------- WaitForAnswer -----------------------
  83.  
  84.   Wait for answer on previously sent message. Free message afterwards. Primary
  85.   return code is returned, the result string (if any) written to <result>.
  86.  
  87. */
  88.  
  89. ULONG
  90. WaitForAnswer(port, result)
  91.  
  92. struct MsgPort *port;
  93. char   *result;
  94. {
  95.     struct RexxMsg *rexxMsg;
  96.     ULONG  error;
  97.  
  98.     *result = NULL;
  99.  
  100.     do {
  101.         
  102.         WaitPort(port);
  103.  
  104.         if (rexxMsg = (struct RexxMsg *)GetMsg(port))
  105.             if ((error = rexxMsg->rm_Result1) == RC_OK)
  106.                 if (rexxMsg->rm_Result2)
  107.                     strcpy(result, (char *)rexxMsg->rm_Result2);
  108.  
  109.     } while (!rexxMsg);
  110.  
  111.     FreeRexxCommand(rexxMsg);
  112.     return(error);
  113. }
  114.  
  115. /* ------------------------------------- FreeRexxCommand ----------------------
  116.  
  117.  Free ARexx message
  118.  
  119. */
  120.  
  121. void
  122. FreeRexxCommand(rexxmessage)
  123.  
  124. struct RexxMsg *rexxmessage;
  125. {
  126.     if (rexxmessage->rm_Result1 == RC_OK) 
  127.         if (rexxmessage->rm_Result2)
  128.             DeleteArgstring((char *)rexxmessage->rm_Result2);
  129.  
  130.     DeleteArgstring((char *)ARG0(rexxmessage));
  131.  
  132.     DeleteRexxMsg(rexxmessage);
  133. }
  134.  
  135. /* ---------------------------------- SendRexxCommand -------------------------
  136.  
  137.  Send ARexx message
  138.  
  139. */
  140.  
  141. struct RexxMsg *
  142. SendRexxCommand(port, cmd, replyPort)
  143.  
  144. char   *cmd,   *port;
  145. struct MsgPort *replyPort;
  146. {
  147.     struct MsgPort *rexxport;
  148.     struct RexxMsg *rexx_command_message = NULL;
  149.  
  150.     Forbid();
  151.  
  152.     if (rexxport = FindPort(port)) {
  153.  
  154.         if (rexx_command_message = CreateRexxMsg(replyPort, NULL, NULL)) {
  155.  
  156.             if (rexx_command_message->rm_Args[0] = CreateArgstring(cmd, strlen(cmd))) {
  157.  
  158.                 rexx_command_message->rm_Action = RXCOMM | RXFF_RESULT;
  159.  
  160.                 PutMsg(rexxport, &rexx_command_message->rm_Node);
  161.             }
  162.         }
  163.     }
  164.  
  165.     Permit();
  166.     return(rexx_command_message);
  167. }
  168.  
  169. ///
  170.